import CryptoJS from 'crypto-js'

// 从环境变量读取密钥和 IV，VITE_SECRET_KEY 和 VITE_SECRET_IV 要在 .env 里定义
// 注意：IV 必须是 16 字节长度字符串
const SECRET_KEY = import.meta.env.VITE_SECRET_KEY || 'default-secret-key-1234'
const IV_STR = import.meta.env.VITE_SECRET_IV || '1234567890123456'

// 转换 IV 字符串为 CryptoJS 需要的格式
const IV = CryptoJS.enc.Utf8.parse(IV_STR)

/**
 * 加密函数，将传入的数据（对象或字符串）转成加密后的字符串
 * @param {string|object} data - 需要加密的数据
 * @returns {string} - 加密后的 Base64 字符串
 */
function encrypt(data) {
  const str = typeof data === 'string' ? data : JSON.stringify(data)

  const encrypted = CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(SECRET_KEY), {
    iv: IV,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })

  return encrypted.toString()
}

/**
 * 解密函数，将加密后的字符串解密回原始数据（对象或字符串）
 * @param {string} cipherText - 加密的 Base64 字符串
 * @returns {string|object} - 解密后的原始数据
 */
function decrypt(cipherText) {
  const bytes = CryptoJS.AES.decrypt(cipherText, CryptoJS.enc.Utf8.parse(SECRET_KEY), {
    iv: IV,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })

  const decryptedStr = bytes.toString(CryptoJS.enc.Utf8)

  try {
    return JSON.parse(decryptedStr)
  } catch {
    return decryptedStr
  }
}

/**
 * 封装 localStorage 的加密存储操作，自动加密和解密
 */
export const secureStorage = {
  set(key, value) {
    const encrypted = encrypt(value)
    localStorage.setItem(key, encrypted)
  },

  get(key) {
    const encrypted = localStorage.getItem(key)
    if (!encrypted) return null
    try {
      return decrypt(encrypted)
    } catch (err) {
      console.error('解密失败:', err)
      return null
    }
  },

  remove(key) {
    localStorage.removeItem(key)
  },

  clear() {
    localStorage.clear()
  }
}
